* fileio.c: Fix bugs with large file offsets (Bug#9428).
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 6 Sep 2011 15:38:39 +0000 (08:38 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 6 Sep 2011 15:38:39 +0000 (08:38 -0700)
commit365071f851199f7411ad9079cda2ab3ed99d2c28
tree557538e0a5093921a7ebd59f199f90eadde88a5b
parenta7e0ff52a3249f7038423e8a61bcb85355236e07
parente979b4fb742edadea044917c42f4745e40329a25
* fileio.c: Fix bugs with large file offsets (Bug#9428).

The previous code assumed that file offsets (off_t values) fit in
EMACS_INT variables, which is not true on typical 32-bit hosts.
The code messed up by falsely reporting buffer overflow in cases
such as (insert-file-contents "big" nil 1 2) into an empty buffer
when "big" contains more than 2**29 bytes, even though this
inserts just one byte and does not overflow the buffer.
(Finsert_file_contents): Store file offsets as off_t
values, not as EMACS_INT values.  Check for overflow when
converting between EMACS_INT and off_t.  When checking for
buffer overflow or for overlap, take the offsets into account.
Don't use EMACS_INT for small values where int suffices.
When checking for overlap, fix a typo: ZV was used where
ZV_BYTE was intended.
(Fwrite_region): Don't assume off_t fits into 'long'.
* buffer.h (struct buffer.modtime_size): Now off_t, not EMACS_INT.